package com.xinke.edu.mypetadoption.fragment3.adpter;

import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import com.chad.library.adapter4.BaseQuickAdapter;
import com.chad.library.adapter4.viewholder.QuickViewHolder;
import com.xinke.edu.mypetadoption.R;
import com.xinke.edu.mypetadoption.entity.Merchant;
import com.xinke.edu.mypetadoption.entity.ResultBody;
import com.xinke.edu.mypetadoption.util.RetrofitUtil;

import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
import io.reactivex.rxjava3.core.Observer;
import io.reactivex.rxjava3.disposables.Disposable;
import io.reactivex.rxjava3.schedulers.Schedulers;

/**
 * 商家审核适配器
 * 用于显示商家列表及其审核状态，并提供状态更新功能
 */
public class ZzAdpter extends BaseQuickAdapter<Merchant, QuickViewHolder> {

    private OnStatusUpdateListener listener;

    // 状态更新监听接口
    public interface OnStatusUpdateListener {
        void onStatusUpdated();
    }

    // 设置监听器
    public void setOnStatusUpdateListener(OnStatusUpdateListener listener) {
        this.listener = listener;
    }

    @Override
    protected void onBindViewHolder(@NonNull QuickViewHolder quickViewHolder, int i, @Nullable Merchant merchant) {
        if (merchant == null) return;

        // 设置店铺信息
        quickViewHolder.setText(R.id.zzdp, merchant.getName());
        // 设置联系人信息格式 电话
        String contactInfo = merchant.getContactPhone();
        quickViewHolder.setText(R.id.zzmc, contactInfo);

        // 获取按钮引用
        Button btnLabel1 = quickViewHolder.getView(R.id.xz1); // 状态标签
        Button btnAction1 = quickViewHolder.getView(R.id.xz2); // 主要操作按钮
        Button btnAction2 = quickViewHolder.getView(R.id.xz3); // 次要操作按钮

        // 根据商家当前状态显示不同的按钮组合和样式
        int currentStatus = merchant.getStatus();
        
        // 初始化所有按钮为可见
        btnLabel1.setVisibility(View.VISIBLE);
        btnAction1.setVisibility(View.VISIBLE);
        btnAction2.setVisibility(View.VISIBLE);
        
        switch (currentStatus) {
            case 0: // 待审核状态
                // 待审核状态：显示"待审核"标签和"通过"/"驳回"按钮
                setupPendingStatus(btnLabel1, btnAction1, btnAction2, merchant, i);
                break;
            case 1: // 已认证状态
                // 已认证状态：显示"已认证"标签和"禁用"按钮，隐藏第二个操作按钮
                setupApprovedStatus(btnLabel1, btnAction1, btnAction2, merchant, i);
                break;
            case 2: // 已禁用状态
                // 已禁用状态：显示"已禁用"标签和"启用"按钮，隐藏第二个操作按钮
                setupDisabledStatus(btnLabel1, btnAction1, btnAction2, merchant, i);
                break;
        }
    }

    /**
     * 设置待审核状态的UI
     */
    private void setupPendingStatus(Button btnLabel, Button btnApprove, Button btnReject, Merchant merchant, int position) {
        // 设置待审核标签（黄色背景）
        btnLabel.setText("待审核");
        btnLabel.setBackgroundColor(0xFFFFC000); // 黄色
        btnLabel.setTextColor(0xFFFFFFFF); // 黑色文字
        btnLabel.setClickable(false); // 标签不可点击
        
        // 设置通过按钮（绿色）
        btnApprove.setText("通过");
        btnApprove.setBackgroundColor(0xFF4CAF50); // 绿色
        btnApprove.setTextColor(0xFFFFFFFF); // 白色文字
        btnApprove.setOnClickListener(v -> showStatusConfirmDialog(getContext(), merchant, 1, position, "通过"));
        
        // 设置驳回按钮（红色）
        btnReject.setText("驳回");
        btnReject.setBackgroundColor(0xFFF44336); // 红色
        btnReject.setTextColor(0xFFFFFFFF); // 白色文字
        btnReject.setOnClickListener(v -> showStatusConfirmDialog(getContext(), merchant, 2, position, "驳回"));
    }

    /**
     * 设置已认证状态的UI
     */
    private void setupApprovedStatus(Button btnLabel, Button btnDisable, Button btnPlaceholder, Merchant merchant, int position) {
        // 设置已认证标签（绿色背景）
        btnLabel.setText("已认证");
        btnLabel.setBackgroundColor(0xFF4CAF50); // 绿色
        btnLabel.setTextColor(0xFFFFFFFF); // 白色文字
        btnLabel.setClickable(false); // 标签不可点击
        
        // 设置禁用按钮（橙色）
        btnDisable.setText("禁用");
        btnDisable.setBackgroundColor(0xFFFF9800); // 橙色
        btnDisable.setTextColor(0xFFFFFFFF); // 白色文字
        btnDisable.setOnClickListener(v -> showStatusConfirmDialog(getContext(), merchant, 2, position, "禁用"));
        
        // 隐藏多余按钮
        btnPlaceholder.setVisibility(View.GONE);
    }

    /**
     * 设置已禁用状态的UI
     */
    private void setupDisabledStatus(Button btnLabel, Button btnEnable, Button btnPlaceholder, Merchant merchant, int position) {
        // 设置已禁用标签（红色背景）
        btnLabel.setText("已禁用");
        btnLabel.setBackgroundColor(0xFFF44336); // 红色
        btnLabel.setTextColor(0xFFFFFFFF); // 白色文字
        btnLabel.setClickable(false); // 标签不可点击
        
        // 设置启用按钮（绿色）
        btnEnable.setText("启用");
        btnEnable.setBackgroundColor(0xFF4CAF50); // 绿色
        btnEnable.setTextColor(0xFFFFFFFF); // 白色文字
        btnEnable.setOnClickListener(v -> showStatusConfirmDialog(getContext(), merchant, 1, position, "启用"));
        
        // 隐藏多余按钮
        btnPlaceholder.setVisibility(View.GONE);
    }

    /**
     * 显示状态更改确认对话框
     */
    private void showStatusConfirmDialog(Context context, Merchant merchant, int newStatus, int position, String actionName) {
        new AlertDialog.Builder(context)
                .setTitle("操作确认")
                .setMessage("确定要" + actionName + "商家\"" + merchant.getName() + "\"吗？")
                .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        // 调用API更新商家状态
                        updateMerchantStatus(merchant.getId().intValue(), newStatus, context, position);
                    }
                })
                .setNegativeButton("取消", null)
                .show();
    }

    /**
     * 更新商家状态
     * @param merchantId 商家ID
     * @param status 新状态（0:待审核, 1:已认证, 2:已禁用）
     * @param context 上下文
     * @param position 列表位置
     */
    private void updateMerchantStatus(int merchantId, int status, Context context, int position) {
        RetrofitUtil.getApi().setAccreditation(merchantId, status)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<ResultBody>() {
                    @Override
                    public void onSubscribe(@NonNull Disposable d) {}

                    @Override
                    public void onNext(@NonNull ResultBody result) {
                        if (result != null && result.getCode() == 200) {
                            Toast.makeText(context, "操作成功", Toast.LENGTH_SHORT).show();
                            // 通知监听器刷新列表
                            if (listener != null) {
                                listener.onStatusUpdated();
                            }
                        } else {
                            Toast.makeText(context, "操作失败：" + (result != null ? result.getMessage() : "未知错误"), Toast.LENGTH_SHORT).show();
                        }
                    }

                    @Override
                    public void onError(@NonNull Throwable e) {
                        Toast.makeText(context, "网络请求失败：" + e.getMessage(), Toast.LENGTH_SHORT).show();
                    }

                    @Override
                    public void onComplete() {}
                });
    }

    @NonNull
    @Override
    protected QuickViewHolder onCreateViewHolder(@NonNull Context context, @NonNull ViewGroup viewGroup, int i) {
        return new QuickViewHolder(R.layout.item_gly_sjshenhe, viewGroup);
    }
}
